文章目录
  1. 1. 前言
    1. 1.1. 方法一
    2. 1.2. 方法二
    3. 1.3. 方法三
  2. 2. 总结

前言

参考了网上的教程自己动手调试so文件,在过程中发现了一些问题,并且有部分步骤和网上的教程不太一样。
用到的工具和样本:

IDA 6.8
debugjniso.apk
libdebugjniso.so

实验的apk文件和so文件是从非虫的Android软件安全与逆向分析中动态调试一章中获得的样本。主要的功能是点击界面的按钮控件更改应用的标题,而这部分的功能是在so文件中实现的。

在捣鼓的过程中,主要分成了三种方法,具体步骤如下:

方法一

1.开启android_server

2.端口转发

3.以调试方式启动程序

打开ddms ,接着以调试方式启动程序

4.jdb connect

5.ida调试端口设置及挂接

假设出现下面的情况话,全部选cancel即可

Debugger-Attach-RemoteArmLinux/Android debugger,Hostname填localhost,port是android_server开启的端口

(注意, 不打开应用就无法挂接相应的process ,所以该步之前会有步骤3)

6.下断点和运行调试

要注意的是, 确保so文件已经被加载到内存中,否则会查找不到so文件的内存基地址
接着ctrl+s,找到内存地址

打开另外一个ida,加载so文件,找到要下断点函数对应的位置

可以得知,jniString()方法的偏移地址为C38,所以对应的内存地址为7689FC38,按G跳转到对应的地址

下断点

运行(F9),点击界面的控件,接着进行调试,F7单步步入,F8单步步出

方法二

1.打开ida加载so文件,在对应的函数处下断点。

2.开启android_server

3.端口转发

4.以调试方式启动程序

5.ida调试端口设置及挂接

6.jdb connect

7.点击运行(F9),点击手机的控件

点击“same”。直接就跳到断点处了。

方法三

假设不考虑反调试或加壳的情况,仅仅是简单地动态调试那么有个更加简便的方法。

  1. 启动android_server
  2. 端口转发
  3. ida加载so文件,并在相应的位置下断点
  4. 在手机打开应用,ida挂接,attach to process
  5. 运行(F9),点击手机控件,就跳到相应断点的地方了,接着可以开始调试。

总结

下面是调试过程中的一些总结和思考。

方法一二三的不同之处在于:

  1. 方法一和二是用adb以调试模式打开应用,而方法三是直接在手机打开应用,直接打开应用的一个不足之处在于,加壳通常都是在so文件运行之前做的工作,如果直接手机打开应用,那么就会错过分析加壳过程的时机,因此要用调试模式打开;

  2. 方法一比方法二多了一步寻址的工作,方法二中是先加载so文件下断点,这样就不需要像方法一那样进行断电寻址的工作了。

  3. 综上,假如是普通的动态调试so文件,那么方法三最简便,如果有反调试,那么采用方法二会比较简便。

文章目录
  1. 1. 前言
    1. 1.1. 方法一
    2. 1.2. 方法二
    3. 1.3. 方法三
  2. 2. 总结